package cn.dm.example.immutable;

import cn.dm.annoations.NotThreadSafe;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;

import java.util.Map;

@Slf4j
@NotThreadSafe
public class ImmutableExample1 {

    // 不可变对象测试1:使用final关键字
    private final static Integer a = 1;
    private final static String b = "2";
    private final static Map<Integer, Integer> map = Maps.newHashMap(); // guava包提供

    static {
        map.put(1, 2);
        map.put(3, 4);
        map.put(5, 6);
    }

    public static void main(String[] args) {
        //
        /**
         * 下面a、b赋值就报错,证明 final 修饰的基本数据类型值不可修改
         * map赋值报错,证明 final 修饰的引用数据类型地址不可修改
         */
//        a = 2;
//        b = "3";
//        map = Maps.newHashMap();

        /**
         * 引用数据类型虽然地址不能变,但允许修改里面的值
         * (String 同理)
         */
        map.put(1, 3);
        log.info("{}", map.get(1));
    }

    /**
     * final 修饰的基本数据类型参数,其值也不可修改
     */
    private void test(final int a) {
//        a = 1;
    }
}
